package com.camemax.rabbitmq.simple_mode;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/*
***************************
*   @Date: 2021-06-02
*   @Descript: RabbitMQ Producer for rabbitMQ Simple Mode
***************************
*/
public class Producer {
    /*
    * 所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范，rabbitmq使用的amqp也是
    * 基于tcp/ip的所有协议都需要依靠[ip]&[port]的使用
    * */
    public static void main(String[] args) {
        // 1. 创建RabbitMQ连接工厂
        ConnectionFactory rabbitmqConnFactory = new ConnectionFactory();

        // 2. 配置连接属性
        rabbitmqConnFactory.setHost("172.16.205.100");
        rabbitmqConnFactory.setPort(25672);
        rabbitmqConnFactory.setUsername("camemax");
        rabbitmqConnFactory.setPassword("123");
        rabbitmqConnFactory.setVirtualHost("/"); // 默认虚拟路径[/]

        // 3. 实例化连接Connection
        Connection connection = null;

        // 4. 实例化连接通道Channel
        Channel channel = null;

        // 5. 设置队列名称
        String queueName = "test_queue";

        try {
            // 6. 配置连接
            connection = rabbitmqConnFactory.newConnection("RabbitMQ Producer");

            // 7. 通过连接配置管道
            channel = connection.createChannel();

            // 8. 配置连接通道
            channel.queueDeclare(
                    queueName // 队列名 [String]
                , false // 持久化 => 重启服务后是否保留队列
                , false // 排他性
                , false // 自动删除
                , null ); // 附带参数配置

            // 9. 准备消息内容
            String data = "ʏᴏᴊɪɢᴇɴɴ_ᴘᴏᴋᴇᴛᴛᴏ"; // 幸子さん

            // 10. 生产者发布消息
            channel.basicPublish(
                    "" // 默认交换机
                , queueName // 队列名称
                , null
                , data.getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 11. 关闭通道
            if( channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 12. 关闭连接
            if ( connection != null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
